/**
 * AddOfertaAction.java
 * Action que da de alta una nueva oferta.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 */
package ocio.actions;  


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import ocio.beans.Oferta;
import ocio.beans.Producto;
import ocio.services.ServiceLocator;
import ocio.services.OfertaService;
import ocio.services.ProductoService;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * Clase destinataria de petición de alta de un nuevo cliente.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Oferta
 */
public class AddOfertaAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	private int idproducto;
	private int id;
	private String nombre;
	private int plazasDisp;
	private String plazasDispText;
	private int plazasReserv;
	private Date fechaLim;
	private String fechaLimText;
	private double precioXpersona;
	private String precioXpersonaText;
	private String descripcion;
	
	private Oferta oferta;
	private Producto producto;
	private Set<Oferta> listaOfertas = new HashSet<Oferta>();
	private String mensaje;

    /**
	 * Método execute() de la clase ActionSupport de Struts 2. 
	 * Comprueba que no hay otra oferta con ese nombre y solicita las servicios para dar de alta la nueva oferta
	 * @return un string que indica la respuesta de la acción ejecutada sobre la petición del usuario
	 */
	public String execute(){	
		
		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();
		OfertaService ofertaService = (OfertaService)serviceLocator.getService("Oferta");
		ProductoService productoService = (ProductoService)serviceLocator.getService("Producto");
		
		Map<String,Object> sesion = ActionContext.getContext().getSession();
		idproducto = (Integer)sesion.get("IDPRODUCTO");
		
		producto=(Producto) productoService.searchById(idproducto);
			
		if (ofertaService.add(this)) {
			producto=(Producto) productoService.searchById(idproducto);
			this.listaOfertas=producto.getOfertas();
			return "success";
		} else {
			mensaje="Ya existe una oferta con ese nombre.";
			return "input";
		}
	 }	

    /**
	 * Método validate() de la clase ActionSupport de Struts 2. 
	 * Valida que se han rellendado los campos obligatorios, el formato de fecha, precio y numero de plazas disponibles
	 */
	public void validate(){
		
		if(nombre.length()==0){
			this.addFieldError("nombre","El nombre de la oferta es necesario.");
		}
		
		if(descripcion.length()==0){
			this.addFieldError("descripcion","Se requiere una descripción para la oferta.");
		}
		
		//Comprobar si la fecha es válida
		try { 
				SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
				fechaLim = formatter.parse(this.fechaLimText);
				Date hoy = new Date();
			    if (this.fechaLim.compareTo(hoy)<0) {
			    	this.addFieldError("fechaLimText", "La fecha introducida debe ser mayor a la del día de hoy.");
			    }
		} catch (ParseException e) {
				this.addFieldError("fechaLimText", "La fecha debe tener formato dd/mm/yyyy");
		}
		//Comprobar si viene un número entero en plazasDisp
		try { 
			this.plazasDisp=Integer.parseInt(this.plazasDispText);
		} catch (NumberFormatException e) {
			this.addFieldError("plazasDispText", "Debe introducir un número en plazas disponibles.");
		}
		 //Comprobar si viene un double en precioXpersona
		try {
			this.precioXpersona=Double.parseDouble(this.precioXpersonaText);
		} catch (NumberFormatException e) {
			this.addFieldError("precioXpersonaText", "Debe introducir un número en precio por persona.");
		}

		if (this.plazasDisp<this.plazasReserv) {
			this.addActionError("El número de plazas disponibles no puede ser menor que el de plazas reservadas.");
		 }
		
		mensaje="Error en la introduccion de los datos";
		
	}
	
	/**
	 * Método getter.         
	 * @return nombre
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * Método setter.         
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	/**
	 * Método getter.         
	 * @return descripcion
	 */
	public String getDescripcion() {
		return descripcion;
	}
	
	/**
	 * Método setter.         
	 * @param descripcion
	 */
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	/**
	 * Método getter.         
	 * @return id
	 */
	public int getId() {
		return id;
	}

	/**
	 * Método setter.         
	 * @param id
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Método getter.         
	 * @return plazasDisp
	 */
	public int getPlazasDisp() {
		return plazasDisp;
	}

	/**
	 * Método setter.         
	 * @param plazasDisp
	 */
	public void setPlazasDisp(int plazasDisp) {
		this.plazasDisp = plazasDisp;
	}

	/**
	 * Método getter.         
	 * @return plazasReserv
	 */
	public int getPlazasReserv() {
		return plazasReserv;
	}

	/**
	 * Método setter.         
	 * @param plazasReserv
	 */
	public void setPlazasReserv(int plazasReserv) {
		this.plazasReserv = plazasReserv;
	}
	
	/**
	 * Método getter.         
	 * @return FechaLim
	 */
	public Date getFechaLim() {
		return fechaLim;
	}

	/**
	 * Método setter.         
	 * @param fechaLim
	 */
	public void setFechaLim(Date fechaLim) {
		this.fechaLim = fechaLim;
	}

	/**
	 * Método getter.         
	 * @return precioXPersona
	 */
	public double getPrecioXpersona() {
		return precioXpersona;
	}

	/**
	 * Método setter.         
	 * @param precioXpersona
	 */
	public void setPrecioXpersona(double precioXpersona) {
		this.precioXpersona = precioXpersona;
	}

	/**
	 * Método getter.         
	 * @return oferta
	 */
	public Oferta getOferta() {
		return oferta;
	}

	/**
	 * Método setter.         
	 * @param producto
	 */
	public void setProducto(Producto producto) {
		this.producto = producto;
	}

	/**
	 * Método getter.         
	 * @return producto
	 */
	public Producto getProducto() {
		return producto;
	}
	
	/**
	 * Método setter.         
	 * @param oferta
	 */
	public void setOferta(Oferta oferta) {
		this.oferta = oferta;
	}
	
	/**
	 * Método getter.         
	 * @return idProducto
	 */
	public int getIdproducto() {
		return idproducto;
	}

	/**
	 * Método setter.         
	 * @param idproducto
	 */
	public void setIdproducto(int idproducto) {
		this.idproducto = idproducto;
	}

	/**
	 * Método getter.         
	 * @return listaOfertas
	 */
	public Set<Oferta> getListaOfertas() {
		return listaOfertas;
	}

	/**
	 * Método setter.         
	 * @param listaOfertas
	 */
	public void setListaOfertas(Set<Oferta> listaOfertas) {
		this.listaOfertas = listaOfertas;
	}

	/**
	 * Método getter.         
	 * @return mensaje
	 */
	public String getMensaje() {
		return mensaje;
	}

	/**
	 * Método setter.         
	 * @param mensaje
	 */
	public void setMensaje(String mensaje) {
		this.mensaje = mensaje;
	}
	
	/**
	 * Método getter.         
	 * @return fechaLimText
	 */
	public String getFechaLimText() {
		return fechaLimText;
	}
	/**
	 * Método setter.         
	 * @param fechaLimText
	 */
	public void setFechaLimText(String fechaLimText) {
		this.fechaLimText = fechaLimText;
	}

	/**
	 * Método getter.         
	 * @return precioXpersonaText
	 */
	public String getPrecioXpersonaText() {
		return precioXpersonaText;
	}
	/**
	 * Método setter.         
	 * @param precioXpersonaText
	 */
	public void setPrecioXpersonaText(String precioXpersonaText) {
		this.precioXpersonaText = precioXpersonaText;
	}

	/**
	 * Método getter.         
	 * @return plazasDispText
	 */
	public String getPlazasDispText() {
		return plazasDispText;
	}
	/**
	 * Método setter.         
	 * @param plazasDispText
	 */
	public void setPlazasDispText(String plazasDispText) {
		this.plazasDispText = plazasDispText;
	}

	
}
